Compile Windows resources into cygw32 Emacs
authorDaniel Colascione <dancol@dancol.org>
Mon, 10 Dec 2012 07:11:21 +0000 (23:11 -0800)
committerDaniel Colascione <dancol@dancol.org>
Mon, 10 Dec 2012 07:11:21 +0000 (23:11 -0800)
ChangeLog
configure.ac
nt/ChangeLog
nt/emacs.rc
src/ChangeLog
src/Makefile.in
src/emacs.c
src/unexw32.c
src/w32fns.c
src/w32gui.h

index 5611ee5ebe1881f0ea26b7d808adb61e5ae7c0c9..e3a601d1823cc2818c45d6abed4f71f7a4c6daac 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2012-12-10  Daniel Colascione  <dancol@dancol.org>
+
+       * configure.ac (W32_RES, W32_RES_LINK, WINDRES): Teach the cygw32
+       build how to compile Windows resource files; use these variables
+       to tell src/Makefile.in how and whether to compile resources.
+
 2012-12-05  Glenn Morris  <rgm@gnu.org>
 
        * configure.ac: Handle info/ files with or without ".info" extension.
index 594fe94214d2f4344f7ba92c24ac5681af9d34de..3bfa7c9443b3c3b417b54bf2b5b0c36ae914c9bb 100644 (file)
@@ -1584,6 +1584,8 @@ AC_SUBST(LIB_STANDARD)
 HAVE_W32=no
 W32_OBJ=
 W32_LIBS=
+W32_RES=
+W32_RES_LINK=
 if test "${with_w32}" != no; then
   if test "${opsys}" != "cygwin"; then
     AC_MSG_ERROR([Using w32 with an autotools build is only supported for Cygwin.])
@@ -1592,13 +1594,21 @@ if test "${with_w32}" != no; then
                   [AC_MSG_ERROR([`--with-w32' was specified, but windows.h
                   cannot be found.])])
   AC_DEFINE(HAVE_NTGUI, 1, [Define to use native MS Windows GUI.])
+  AC_CHECK_TOOL(WINDRES, [windres],
+                [AC_MSG_ERROR([No resource compiler found.])])
   W32_OBJ="w32fns.o w32menu.o w32reg.o w32font.o w32term.o"
   W32_OBJ="$W32_OBJ w32xfns.o w32select.o w32uniscribe.o"
   W32_LIBS="$W32_LIBS -lkernel32 -luser32 -lgdi32 -lole32 -lcomdlg32"
   W32_LIBS="$W32_LIBS -lusp10 -lcomctl32 -lwinspool"
+  W32_RES="emacs.res"
+  # Tell the linker that emacs.res is an object (which we compile from
+  # the rc file), not a linker script.
+  W32_RES_LINK="-Wl,-bpe-i386 -Wl,emacs.res"
 fi
 AC_SUBST(W32_OBJ)
 AC_SUBST(W32_LIBS)
+AC_SUBST(W32_RES)
+AC_SUBST(W32_RES_LINK)
 
 if test "${HAVE_W32}" = "yes"; then
   window_system=w32
index b58aa6fa660d9143d066b99b66375d1c935e1904..d6da86adbfb690d10501d416f982a417e4d75199 100644 (file)
@@ -1,3 +1,9 @@
+2012-12-10  Daniel Colascione  <dancol@dancol.org>
+
+       * emacs.rc: Use forward slashes in relative paths in order to
+       avoid complaints from Cygwin.  (Forward slashes work perfectly
+       well in the NT build.)
+
 2012-11-24  Paul Eggert  <eggert@cs.ucla.edu>
 
        Revert recent change for Bug#8855; see ../src/ChangeLog.
index cc93da0ffd2f0ecd008d3a854e6bb6e1352986a7..1653dfd13912cf9a79863768cd4378c175f19460 100644 (file)
@@ -1,5 +1,5 @@
-Emacs ICON   icons\emacs.ico
-32649 CURSOR icons\hand.cur
+Emacs ICON   icons/emacs.ico
+32649 CURSOR icons/hand.cur
 #ifdef WIN64
 1 24 "emacs-x64.manifest"
 #else
index a90e953ffdf7391ebf9977061baf5116376b4f2d..17ba88d9ccb00e26aa0bfbf408c5eb8fb0a962e3 100644 (file)
@@ -1,3 +1,24 @@
+2012-12-10  Daniel Colascione  <dancol@dancol.org>
+
+       * w32gui.h (hprevinst, lpCmdLine, nCmdShow): Remove unused
+       declarations.
+
+       * w32fns.c (cache_system_info): Initialize the global hinst
+       variable here so various initialization calls DTRT.
+
+       * unexw32.c (hprevinst, lpCmdLine, nCmdShow): Remove unused
+       variables.
+       (hinst): Remove unneeded extern declaration.
+       (_start): Remove initialization of above variables; remove
+       initialization of hinst, as cache_system_info now does that.
+
+       * emacs.c (main): Call cache_system_info early in startup; we
+       previously weren't calling it in Cygwin builds.
+
+       * Makefile.in (ntsource, WINDRES, W32_RES, W#@_RES_LINK): Teach
+       the autoconf build system how to compile a Windows resource file
+       and link it to Emacs.
+
 2012-12-08  Jan Djärv  <jan.h.d@swipnet.se>
 
        * nsterm.m (fd_handler:): FD_ZERO fds (Bug#13103).
index c24e421bbbc6528890ddf5e515894f4ace3b93f1..75624dc0631133b9110d5cefb4eda01cd25eb549 100644 (file)
@@ -28,9 +28,11 @@ SHELL = /bin/sh
 # Here are the things that we expect ../configure to edit.
 # We use $(srcdir) explicitly in dependencies so as not to depend on VPATH.
 srcdir = @srcdir@
+ntsource = $(srcdir)/../nt
 abs_builddir = @abs_builddir@
 VPATH = $(srcdir)
 CC = @CC@
+WINDRES = @WINDRES@
 CFLAGS = @CFLAGS@
 CPPFLAGS = @CPPFLAGS@
 LDFLAGS = @LDFLAGS@
@@ -266,6 +268,13 @@ W32_OBJ=@W32_OBJ@
 ## --lwinspool if HAVE_W32, else empty.
 W32_LIBS=@W32_LIBS@
 
+## emacs.res if HAVE_W32
+W32_RES=@W32_RES@
+## If HAVE_W32, compiler arguments for including
+## the resource file in the binary.
+## XXX -Wl,-b -Wl,pe-i386 -Wl,emacs.res
+W32_RES_LINK=@W32_RES_LINK@
+
 ## Empty if !HAVE_X_WINDOWS
 ## xfont.o ftfont.o xftfont.o ftxfont.o if HAVE_XFT
 ## xfont.o ftfont.o ftxfont.o if HAVE_FREETYPE
@@ -328,7 +337,6 @@ ALL_OBJC_CFLAGS=$(ALL_CFLAGS) $(GNU_OBJC_CFLAGS)
        @$(MKDEPDIR)
        $(CC) -c $(CPPFLAGS) $(ALL_OBJC_CFLAGS) $<
 
-
 ## lastfile must follow all files whose initialized data areas should
 ## be dumped as pure by dump-emacs.
 base_obj = dispnew.o frame.o scroll.o xdisp.o menu.o $(XMENU_OBJ) window.o \
@@ -462,9 +470,11 @@ $(obj) $(otherobj): globals.h
 $(lib)/libgnu.a: $(config_h)
        cd $(lib) && $(MAKE) libgnu.a
 
-temacs$(EXEEXT): $(START_FILES) stamp-oldxmenu $(obj) $(otherobj) $(lib)/libgnu.a
+temacs$(EXEEXT): $(START_FILES) stamp-oldxmenu $(obj) $(otherobj) \
+                $(lib)/libgnu.a $(W32_RES)
        $(CC) $(LD_FIRSTFLAG) $(ALL_CFLAGS) $(TEMACS_LDFLAGS) $(TEMACS_LDFLAGS2) \
-         -o temacs $(START_FILES) $(obj) $(otherobj) $(lib)/libgnu.a $(LIBES)
+         -o temacs $(START_FILES) $(obj) $(otherobj) $(lib)/libgnu.a $(LIBES) \
+         $(W32_RES_LINK)
        test "$(CANNOT_DUMP)" = "yes" || \
          test "X$(PAXCTL)" = X || $(PAXCTL) -r temacs$(EXEEXT)
 
@@ -505,11 +515,14 @@ $(OLDXMENU): $(OLDXMENU_TARGET)
 
 doc.o: buildobj.h
 
+emacs.res: $(ntsource)/emacs.rc \
+          $(ntsource)/icons/emacs.ico \
+          $(ntsource)/emacs-x86.manifest
+       $(WINDRES) -O COFF -o $@ $(ntsource)/emacs.rc
 
 ns-app: emacs$(EXEEXT)
        cd ../nextstep && $(MAKE) $(MFLAGS) all
 
-
 .PHONY: mostlyclean clean bootstrap-clean distclean maintainer-clean
 .PHONY: versionclean extraclean frc
 
index f533c3ae983c80b4f65eabd7822599b3f078ee50..4f5044db1c52cfce6ecde5a2fc4bf9fa7f40a8f7 100644 (file)
@@ -40,6 +40,7 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 #if defined WINDOWSNT || defined HAVE_NTGUI
 #include "w32select.h"
 #include "w32font.h"
+#include "w32common.h"
 #endif
 
 #if defined HAVE_NTGUI && defined CYGWIN
@@ -720,6 +721,13 @@ main (int argc, char **argv)
     }
 #endif
 
+#if defined WINDOWSNT || defined HAVE_NTGUI
+  /* Set global variables used to detect Windows version.  Do this as
+     early as possible.  (unexw32.c calls this function as well, but
+     the additional call here is harmless.) */
+  cache_system_info ();
+#endif
+
 #ifdef RUN_TIME_REMAP
   if (initialized)
     run_time_remap (argv[0]);
index 1e591a78b73e65a68e3c6c6cadba5ded53b58777..ee1deb5f92e0455ffd8cfe088caf1ef583f33530 100644 (file)
@@ -85,13 +85,6 @@ DWORD_PTR  extra_bss_size_static = 0;
 
 PIMAGE_SECTION_HEADER heap_section;
 
-#ifdef HAVE_NTGUI
-extern HINSTANCE hinst;
-HINSTANCE hprevinst = NULL;
-LPSTR lpCmdLine = "";
-int nCmdShow = 0;
-#endif /* HAVE_NTGUI */
-
 /* Startup code for running on NT.  When we are running as the dumped
    version, we need to bootstrap our heap and .bss section into our
    address space before we can actually hand off control to the startup
@@ -121,15 +114,6 @@ _start (void)
   /* Prevent Emacs from being locked up (eg. in batch mode) when
      accessing devices that aren't mounted (eg. removable media drives).  */
   SetErrorMode (SEM_FAILCRITICALERRORS);
-
-  /* Invoke the NT CRT startup routine now that our housecleaning
-     is finished.  */
-#ifdef HAVE_NTGUI
-  /* determine WinMain args like crt0.c does */
-  hinst = GetModuleHandle (NULL);
-  lpCmdLine = GetCommandLine ();
-  nCmdShow = SW_SHOWDEFAULT;
-#endif
   mainCRTStartup ();
 }
 
index de5cee1d7a77fb8ce909e325ef054503b7587ef6..90bbc61eec6654e9afaedc9b0abecf2c053b1413 100644 (file)
@@ -1828,7 +1828,6 @@ static LRESULT CALLBACK w32_wnd_proc (HWND, UINT, WPARAM, LPARAM);
 static BOOL
 w32_init_class (HINSTANCE hinst)
 {
-
   if (w32_unicode_gui)
     {
       WNDCLASSW  uwc;
@@ -7020,6 +7019,9 @@ cache_system_info (void)
       DWORD data;
     } version;
 
+  /* Cache the module handle of Emacs itself.  */
+  hinst = GetModuleHandle (NULL);
+
   /* Cache the version of the operating system.  */
   version.data = GetVersion ();
   w32_major_version = version.info.major;
index 0da8de97f23ccabcc228349eeecae21548a6de1e..fe2bb2334b560de59e41982e51164363778fe334 100644 (file)
@@ -79,9 +79,6 @@ typedef struct _XImage
 #define FACE_DEFAULT (~0)
 
 extern HINSTANCE hinst;
-extern HINSTANCE hprevinst;
-extern LPSTR lpCmdLine;
-extern int nCmdShow;
 
 /* Bit Gravity */